package star.oath.framework.util;

import java.util.regex.Pattern;

public class MaskUtils {

    // 手机号码正则表达式：匹配11位数字
    private static final Pattern PHONE_PATTERN = Pattern.compile("^1\\d{10}$");

    /**
     * 对手机号码进行脱敏处理
     *
     * @param phoneNumber 原始手机号码
     * @return 脱敏后的手机号码，格式为前三位+***+最后两位
     * @throws IllegalArgumentException 如果输入的手机号码格式不正确
     */
    public static String maskPhoneNumber(String phoneNumber) {
        // 验证输入是否为有效的11位手机号码
        if (phoneNumber == null || !PHONE_PATTERN.matcher(phoneNumber).matches()) {
            throw new IllegalArgumentException("无效的手机号码格式，必须是11位数字");
        }

        // 截取前三位和最后两位，中间用***替换
        String prefix = phoneNumber.substring(0, 3);
        String suffix = phoneNumber.substring(9, 11);

        return prefix + "***" + suffix;
    }

    // 18位身份证号正则（最后一位可能为X/x）
    private static final Pattern ID_CARD_PATTERN = Pattern.compile("^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$");

    /**
     * 对18位身份证号进行脱敏处理
     *
     * @param idCard 原始身份证号
     * @return 脱敏后的身份证号
     * @throws IllegalArgumentException 若身份证号格式无效
     */
    public static String maskIdCard(String idCard) {
        // 验证输入有效性
        if (idCard == null || !ID_CARD_PATTERN.matcher(idCard).matches()) {
            throw new IllegalArgumentException("无效的18位身份证号");
        }

        // 截取各部分：前4位 + 出生月份（第11-12位） + 最后2位
        String prefix = idCard.substring(0, 4);                  // 前4位（省市）
        String birthMonth = idCard.substring(10, 12);            // 出生月份（第11-12位）
        String suffix = idCard.substring(16, 18);                // 最后2位（校验位及前一位）

        // 拼接脱敏结果
        return prefix + "******" + birthMonth + "***" + suffix;
    }

}
